#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2023 - 2023 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2023/1/3 20:13
# @Author  : heihieyouheihei
# @File    : base5_grammar_08.py
# @IDE     : PyCharm
# 格式化字符串
# 什么是字符串格式化呢?   就是给字符串指定格式,什么货币格式,文本格式,保留几位小数都是格式化字符串
# 在Python提供了两种字符串格式化的方法
# 1. 使用 % 操作符    Python2.6之前推荐
# 2. 使用字符串对象的format()方法    Python2.6之后推荐, 以后都推荐format()方法


# 使用 % 推荐符,
# '%[-][+][0][m][.n]格式化字符'%exp
# 前面的%是必须要有的 [-]表示左对齐,在正数前面没有符号, 负数前面加上一个负号; [+]表示右对齐,采用+号时候, 正数前面加上+,负数前面加上-
# 可选参数[0]表示右对齐,正数前面没有符号,负数前面加上符号,并且用0填充空白处; [m]表示这个数值所占的宽度,[0][m]一起使用的时候不够位数前面就补上0
# [.n]:指定小数点之后保留的位数
# 后面的%也是必须的也不能省略 exp代表要转换的项,如果要转换多个项的时候要使用元组来指定不能使用列表来指定
# ''中间的内容是使用格式化时候的格式,后面的是具体的格式化的项

# 定义一个格式化的模板,使用''(单'引上)
# %09d: d代表数值类型,09代表字符串长度为9; \t: 是一个制表位为了区分后面的内容; %s: s代表字符串; \t: 制表位
template = '编号: %09d\t公司名称: %s \t 官网: http://www.%s.com'    # 定义一个格式化的模板,使用''(单'引上)
# 模板中有3个%也就是说有3个要转化的内容, 要转换的内容有多个时候要使用元组()来使用
item = (7,"百度","baidu")    # 定义要转化的内容
print("使用模板输出指定内容1:",template%item)    # 使用模板输出指定内容
iteml = (8,"明日科技","mingrisoft")
print("使用模板输出指定内容2:",template%iteml)


# % 使用字符串对象的format()方法实现字符串的格式化
# str.format(args)    str: 是一个模板,这个语法的难点也是这个模板
# {[index][:[[fill]align][sign][#][width][.precsion][type]]}
# [index]: 是一个可选参数如果指定的化,它就设置索引位置,索引值从0开始,如果省略则按照值的先后顺序自动分配
# :之后的[fill]参数,来指定空白处填充字符
# align 对齐方式, 如果值是 < 则内容左对齐; 如果是 > 则内容右对齐; 如果是 = 内容左对齐并且把符号放在填充内容的最右侧,这个参数只对数字类型内容有效, 如果 ^ 则内容居中
# [width] 用来指定宽度的
# [sign]用来指定有无符号数的,值为+号则正数加上正号,负数加上负号,; 值为-号则正数不变,负数加上负号, 值为空格则正数加空格,负数加上负号
# [#] 用来指定2进制8进制16进制是否加前缀的,如果加上#就会在前面加上响应的前缀,2进制0b,8进制0O,16进制0x
# [.precision] 用来指定保留的小数位数的
# [type] 是类型参数,所格式化内容的类型, 值为s表示格式化的是字符串, 值为d表示10进制的整数, 值为f表示浮点数

# 编写字符串模板
template2 = '编号: {:0>9s}\t公司名称:{:s} \t官网: http://www.{:s}.com'    # 模板
contex21 = template2.format("7","百度","baidu")
print("format的输出内容1:",contex21)
contex22 = template2.format("8","明日科技","mingrisoft")
print("format的输出内容2:",contex22)

## 在使用format方法,在指定模板的时候可以通过索引进行指定,指定那个位置的内容,但是索引的规范必须统一如果手动指定必须都变成手动指定
template3 = '编号: {0:0>9s}\t公司名称:{1:s} \t官网: http://www.{2:s}.com'    # 模板
contex22 = template3.format("8","明日科技","mingrisoft")
print("手动指定索引的format的输出内容:",contex22)

# 情景模拟 使用format方法实现不同数值类型的数据
# 1251 + 3950 的结果是(以货币形式显示): ￥5,201.00元
# 120000.1用科学计数法表示: 1.200001E+05
# π取5位小数: 3.14159
# 100的16进制结果是: 0×64
# 天才是由 1% 的灵感,加上 99% 的汗水.

# 因为要应用到π值,所以要导入数学模块
import math    # 导入数学模块
print("以货币形式显示: ￥ {:,.2f}元".format(1251 + 3950))    # 以货币形式显示
print("{0:.1f}用科学计数法表示: {0:E}".format(120000.1))    # :E 用科学计数法表示
print("π取5位小数: {:.5f}".format(math.pi))    # math.PI 数学模块中的常量,小数点后5位的浮点型
print("{0:d}的16进制结果是: {0:#x}".format(100))    # 16进制显示
print("天才是由 {:.0%} 的灵感,加上 {:.0%}的汗水".format(0.01,0.99))